package com.ruixi.gen;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;
import com.ruixi.config.EnhanceFreemarkerTemplateEngine;
import com.ruixi.core.BaseController;
import lombok.extern.slf4j.Slf4j;

import java.util.Collections;

/**
 * @Created by lrzg
 * @Date 2022/8/11 09:56
 * @Description TODO
 */
@Slf4j
public class CodeTemplateGenerator {

    public static void main(String[] args) {
        //项目根路径
        String projectPath = System.getProperty("user.dir");
        log.info("projectPath:"+projectPath);

        // 数据源配置
        DataSourceConfig.Builder dataSourceConfig = new DataSourceConfig
                .Builder(
                "jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC",
                "root",
                "root")
                .dbQuery(new MySqlQuery())
                .typeConvert(new MySqlTypeConvert())
                .keyWordsHandler(new MySqlKeyWordsHandler());

        FastAutoGenerator.create(dataSourceConfig)
                //全局配置(GlobalConfig)
                .globalConfig(builder -> {
                    builder.author("lzg") //设置作者
                            .commentDate("YYYY-MM-DD HH:mm:ss")//注释日期
                            .fileOverride()
                            .outputDir(projectPath + "/codegenerator"); //指定输出目录

                })
                //Controller 策略配置-设置父类
                .strategyConfig(builder -> {
                    builder.controllerBuilder().
                            superClass(BaseController.class);
                })
                //包配置(PackageConfig)
                .packageConfig(builder -> {
                    builder.parent("com.ruixi") // 设置父包名
                            .entity("domain");//Entity 包名
                })
                //策略配置(StrategyConfig)
                .strategyConfig(builder -> {
//                    builder.addInclude("tb_user") // 设置需要生成的表名
//                            .addTablePrefix("tb_"); // 设置过滤表前缀
                    builder.addInclude("role") // 设置需要生成的表名
                            .addTablePrefix(""); // 设置过滤表前缀
                    builder.entityBuilder().enableLombok();//开启 lombok 模型
                    builder.entityBuilder().enableTableFieldAnnotation();//开启生成实体时生成字段注解
                    builder.controllerBuilder().enableRestStyle(); //开启生成@RestController 控制器
                    builder.mapperBuilder().enableMapperAnnotation(); //Mapper 策略配置,开启 @Mapper 注解

                })
                //自定义模板
                .injectionConfig(consumer -> {
                    //自定义配置 Map 对象
                    consumer.customMap(Collections.singletonMap("test", "ruixi"));
                    //自定义配置模板文件,下面的key会作为类名后缀，进而生成新类
                    consumer.customFile(Collections.singletonMap(".java", "/templates/entity.java.ftl"));
                    consumer.customFile(Collections.singletonMap(".java", "/templates/controller.java.ftl"));

                    //输出文件之前消费者
                    consumer.beforeOutputFile( (tableInfo, objectMap) -> {
                        log.info("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
                    });

                })
                //模板配置(TemplateConfig)
//                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .templateEngine(new EnhanceFreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }
}
